#include "List.h"

//************************************
// Method:    	SearchId				寻找链表中指定ID号的元素并返回
// Programmer:  lww
// Time:		2019/2/15
// Returns:   	List_Base_t*			如果找到，返回元素指针，否则返回NULL
// Parameter: 	List_Base_t * _base		元素所在链表头元素的地址
// Parameter: 	int ID					寻找的元素的ID号
//************************************
List_Base_t* SearchId(List_Base_t* _base, unsigned int ID)
{
	if (_base != NULL)
	{
		if (_base->ID == ID)
		{
			return _base;
		}
		else
		{
			while (_base->Next)
			{
				_base = _base->Next;
				if (_base->ID == ID)
				{
					return _base;
				}
			}
		}
	}
	return NULL;
}

//************************************
// Method:    	SearchAt				寻找链表中指定顺序号的元素并返回
// Programmer:  lww
// Time:		2019/2/21
// Returns:   	List_Base_t*			如果找到，返回元素指针，否则，返回NULL
// Parameter: 	List_Base_t * _base		元素所在链表头元素的地址
// Parameter: 	int Index				寻找的元素的位置
//************************************
List_Base_t* SearchAt(List_Base_t* _base, int Index)
{
	int _iCnt = 0;

	while (_base != NULL)
	{
		if (_iCnt == Index)
			return _base;

		_iCnt++;
		_base = _base->Next;
	}
	return NULL;
}

//************************************
// Method:    	AddElement				链表中增加指定ID号的元素
// Programmer:  lww
// Time:		2019/2/15
// Returns:   	List_Info_e				返回链表操作状态（成功、内存失败、ID号已存在）
// Parameter: 	List_Tab_t * arg		链表头元素的地址
// Parameter: 	int ID					增加元素的ID号
//************************************
List_Info_e AddElement(List_Tab_t* arg, unsigned int ID)
{
	List_Base_t** base = (List_Base_t**)&(arg->ppData[0]);
	if (base[0] == NULL)
	{
		base[0] = (List_Base_t*)calloc(1, arg->iEleLen);
		if (base[0] != NULL)
		{
			base[0]->ID = ID;
		}
		else
		{
			return LIST_MEMFAIL;
		}
	}
	else
	{
		if (SearchId(base[0], ID))
		{
			return LIST_IDEXIT;
		}
		while (base[0]->Next)
		{
			base = (List_Base_t**)&(base[0]->Next); //链表循环到末尾，再其后面添加新的元素
		}
		base[0]->Next = (List_Base_t*)calloc(1, arg->iEleLen);
		if (base[0] != NULL)
		{
			base = (List_Base_t**)&(base[0]->Next);  //添加新的元素
			base[0]->ID = ID;
		}
		else
		{
			return LIST_MEMFAIL;
		}
	}
	arg->iCount++;
	return LIST_OK;
}

//************************************
// Method:    	DelElement				链表中删除指定ID号的元素
// Programmer:  lww
// Time:		2019/2/15
// Returns:   	List_Info_e				返回链表操作状态（成功、ID号不存在）
// Parameter: 	List_Tab_t * arg		链表头元素的地址
// Parameter: 	int ID					被删除元素的ID号
//************************************
List_Info_e DelElement(List_Tab_t* arg, unsigned int ID)
{
	List_Base_t** base = (List_Base_t**)&(arg->ppData[0]);
	List_Base_t* del_obj;
	if (SearchId(base[0], ID))
	{
		//< 判断是否为首元素
		if (base[0]->ID == ID)
		{
			del_obj = base[0];
			base[0] = base[0]->Next;
			FREE_Pt(del_obj);
			return LIST_OK;
		}
		while (base[0]->Next)
		{
			if (base[0]->Next->ID == ID)
			{
				del_obj = base[0]->Next;
				base[0]->Next = base[0]->Next->Next;
				FREE_Pt(del_obj);
				return LIST_OK;
			}
			base = (List_Base_t**)&(base[0]->Next);
		}
	}
	return LIST_IDNON;
}

//************************************
// Method:    	myfree_Pt			内存释放函数
// Programmer:  lww
// Time:		2018/11/13
// Returns:   	void
// Parameter: 	void * * point		首地址指针的指针
//************************************
void myfree_Pt(void ** point)
{
	if (*point != NULL)
	{
		free(*point);
		*point = NULL;
	}
}
